package com.ymtms.applicationsystem.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ymtms.applicationsystem.dao.EmpMapper;
import com.ymtms.applicationsystem.exception.EmpException;
import com.ymtms.applicationsystem.pojo.Emp;
import com.ymtms.applicationsystem.service.EmpService;
import com.ymtms.applicationsystem.vo.RequestBean;
import com.ymtms.applicationsystem.vo.Result;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @auther: autumn-luo
 * @description:
 * @createTime: 2019-10-22 10:42
 */
@Log4j2
@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;


    @Override
    /*
     * @createTime 2019-10-24 16:18
     * @author autumn-luo
     * @param: emp
     * @return:
     * @description: 职员添加
     */
    public int empAdd(Emp emp) {
        emp.setFlag(0);
        int empAddResult = empMapper.insert(emp);
        if (empAddResult == 0) {
            throw new EmpException("职员插入失败");
        } else {
            return empAddResult;
        }
    }

    @Override
    /*
     * @createTime 2019-10-24 16:19
     * @author autumn-luo
     * @param: empRequest
     * @param: empSeekInfo
     * @return:
     * @description: 职员分页查询 带搜索条件  分别调用2个方法
     */
    public Result<Emp> empGetAll(RequestBean empRequest, String empSeekInfo) {
        log.info("empSeekInfo:" + empSeekInfo);
        // 获取当前页和页大小
        Integer currentPage = empRequest.getPage();
        Integer pageSize = empRequest.getLimit();

        // 判断是否有排序,有则生成符合pagehelper的排序字符串
        String sidx = empRequest.getSidx(); // 排序参数
        String sord = empRequest.getSord(); // 排序规则

        String orderBy = "";
        // pagehelper静态设置页属性方法，它会拦截下面的第一个查询！第二个无效。
        if (checkOrderBy(sidx, sord)) {
            sidx = upperCharToUnderLine(sidx);
            orderBy = sidx + " " + sord;
            PageHelper.startPage(currentPage, pageSize, orderBy);
        } else {
            // 设置当前页和页大小
            PageHelper.startPage(currentPage, pageSize);
        }


        // 查询结果（传入排序）
        List<Emp> empAll = empMapper.selectEmpGetAll(empSeekInfo);

        // 利用当前页和页大小配置pageinfo
        PageInfo<Emp> pageList = new PageInfo<>(empAll);
        // 新建一个封装类对象，设置参数，传入查询得到的数据
        Result<Emp> empInfo = new Result<>();
        if (empAll.size() == 0) {
            // 存入查询数据
            empInfo.setData(null);
            // 存入总条数
            empInfo.setCount(1);
        } else {
            // 存入查询数据
            empInfo.setData(empAll);
            // 存入总条数
            empInfo.setCount(pageList.getTotal());
        }


        return empInfo;

    }

    @Override
    /*
     * @createTime 2019-10-24 16:20
     * @author autumn-luo
     * @param: empId
     * @return:
     * @description: 职员的软删除
     */
    public int empDel(Integer empId) {
        int delResult = empMapper.empDelSoft(empId);
        if (delResult == 1) {
            return delResult;
        } else {
            throw new EmpException("被删除职员的id为空 location--" + EmpServiceImpl.class.getName());
        }

    }

    @Override
    public int empUpdate(Emp emp) {
        emp.setFlag(0);
        int empUpdateResult = empMapper.updateByPrimaryKey(emp);
        if (empUpdateResult == 0) {
            throw new EmpException("职员更新失败");
        } else {
            return empUpdateResult;
        }


    }

    // 判断是否非空
    private boolean checkOrderBy(String sidx, String sord) {
        if (sidx != null && sord != null
                && sidx.trim().length() > 0
                && sord.trim().length() > 0) {
            return true;
        }
        return false;
    }

    // 大写转换为下划线+小写
    public static String upperCharToUnderLine(String param) {
        Pattern p = Pattern.compile("[A-Z]");
        if (param == null || param.equals("")) {
            return "";
        }
        StringBuilder builder = new StringBuilder(param);
        Matcher mc = p.matcher(param);
        int i = 0;
        while (mc.find()) {
            builder.replace(mc.start() + i, mc.end() + i, "_" + mc.group().toLowerCase());
            i++;
        }

        if ('_' == builder.charAt(0)) {
            builder.deleteCharAt(0);
        }
        return builder.toString();
    }
}
